import math
from datetime import datetime
import hashlib
import json
from pathlib import Path

class TextProcessor:
    def __init__(self, cache_file="text_analysis_cache.json"):
        self.cache_file = Path(cache_file)
        self.cache = self.load_cache()
        
    def load_cache(self):
        """加载缓存"""
        if self.cache_file.exists():
            try:
                with open(self.cache_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
            except:
                return {}
        return {}
    
    def save_cache(self):
        """保存缓存"""
        with open(self.cache_file, 'w', encoding='utf-8') as f:
            json.dump(self.cache, f, ensure_ascii=False, indent=2)
    
    def get_cache_key(self, text: str, prompt: str) -> str:
        """生成缓存键"""
        content = f"{text}:{prompt}"
        return hashlib.md5(content.encode('utf-8')).hexdigest()
    
    def get_from_cache(self, text: str, prompt: str) -> str:
        """从缓存获取结果"""
        key = self.get_cache_key(text, prompt)
        return self.cache.get(key)
    
    def save_to_cache(self, text: str, prompt: str, result: str):
        """保存结果到缓存"""
        key = self.get_cache_key(text, prompt)
        self.cache[key] = result
        self.save_cache()

    def split_text_smart(self, text: str, chunk_size: int) -> list:
        """
        智能分割文本，避免在句子中间切分
        """
        if len(text) <= chunk_size:
            return [text]
        
        chunks = []
        current_pos = 0
        text_length = len(text)
        
        # 常见的句子结束符
        sentence_ends = ['。', '！', '？', '；', '\n\n', '. ', '! ', '? ', '; ']
        
        while current_pos < text_length:
            if current_pos + chunk_size >= text_length:
                chunks.append(text[current_pos:])
                break
                
            # 寻找最近的句子结束位置
            chunk_end = current_pos + chunk_size
            best_end = chunk_end
            
            # 向后查找最近的句子结束符
            for end in sentence_ends:
                pos = text.rfind(end, current_pos, chunk_end + 100)
                if pos != -1 and pos <= chunk_end + 100:
                    best_end = pos + len(end)
                    break
            
            chunks.append(text[current_pos:best_end])
            current_pos = best_end
        
        return chunks

    def merge_results(self, results: list, with_summary: bool = True) -> str:
        """
        合并多个分析结果，可选是否添加总结
        """
        if not results:
            return ""
        
        if len(results) == 1:
            return results[0]
        
        merged = "\n\n".join([
            f"【第{i+1}部分分析】\n{result}" 
            for i, result in enumerate(results)
        ])
        
        if with_summary and len(results) > 1:
            merged += "\n\n【总体总结】\n" + results[-1]
        
        return merged

    def save_to_file(self, content: str, file_path: str, file_format: str = "txt"):
        """
        保存内容到文件，支持 txt 和 markdown 格式
        """
        try:
            with open(file_path, 'w', encoding='utf-8') as f:
                if file_format.lower() == "markdown":
                    # Markdown 格式
                    f.write(f"""# 金融市场分析报告

## 基本信息
- 生成时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
- 报告类型：AI辅助分析报告

## 分析内容
{content}

## 免责声明
本报告由 AI 分析系统生成，仅供参考。投资有风险，入市需谨慎。分析结果不构成投资建议，据此操作风险自负。
""")
                else:
                    # TXT 格式
                    f.write(f"""金融市场分析报告
{'='*50}

基本信息：
生成时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
报告类型：AI辅助分析报告

分析内容：
{'-'*50}
{content}

{'='*50}
免责声明：
本报告由 AI 分析系统生成，仅供参考。
投资有风险，入市需谨慎。
分析结果不构成投资建议，据此操作风险自负。
""")
            return True
        except Exception as e:
            print(f"保存文件时出错: {str(e)}")
            return False 